class Observer {
  constructor(data) {
    this.walk(data);
  }
  walk(data) {
    // 遍历data所有属性
    // 1. 判断是否是空值还是对象，如果是空什么都不做，如果是对象，调用defineReactive
    if (!data || typeof data !== "object") {
      return;
    }
    // 2.
    Object.keys(data).forEach((key) => {
      this.defineReactive(data, key, data[key]);
    });
  }
  // 调用Object.defineProperty把data 的属性转换成getter 和setter
  /**
   *
   * @param {*} obj 需要转换的对象
   * @param {*} key 对象的key
   * @param {*} val 对象的值
   */
  defineReactive(obj, key, val) {
    let that = this;
    // 负责收集依赖，并发送通知
    let dep = new Dep() 
    // 如果 key 所对应的val 是对象，这把对象中的属性也转换成getter和setter
    this.walk(val);
    Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get() {
        // 判断Dep。target 是否存在，如果存在，调用dep.addSub(Dep.target),手机依赖
        Dep.target && dep.addSub(Dep.target)
        return val;
      },
      set(newVal) {
        if (newVal === val) {
          return;
        }
        val = newVal;
        that.walk(newVal); //这里不能使用this

        // 发送通知
        dep.notify()
      },
    });
  }
}
